bitkeeper revision 1.1159.212.53 (41fabd0652DGdYKsgWToGTyAOUlZKg)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Fri, 28 Jan 2005 22:30:30 +0000 (22:30 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Fri, 28 Jan 2005 22:30:30 +0000 (22:30 +0000)
Fix the direction flag for string I/O instructions -- missing hunk from earlier patch

Signed-off-by: Jun Nakajima <jun.nakajima@intel.com>
Signed-off-by: Chengyuan Li <chengyuan.li@intel.com>
Signed-off-by: ian.pratt@cl.cam.ac.uk
tools/ioemu/iodev/cpu.cc

index 3e82e7f2c5b2fe2a7dc9981960b4dda1815184ff..5d8c09a3423d40c9d3328eaaf41838ea5e3f5cdb 100644 (file)
@@ -83,6 +83,9 @@ ioreq_t* bx_cpu_c::get_ioreq(void)
 void bx_cpu_c::dispatch_ioreq(ioreq_t *req)
 {
        int ret, i;
+    int sign;
+
+    sign = (req->df) ? -1 : 1;
 
        if ((!req->pdata_valid) && (req->dir == IOREQ_WRITE)) {
                if (req->size != 4) {
@@ -99,7 +102,7 @@ void bx_cpu_c::dispatch_ioreq(ioreq_t *req)
 
                                for (i = 0; i < req->count; i++) {
                                        tmp = BX_INP(req->addr, req->size);
-                                       BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (i * req->size), 
+                                       BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (sign * i * req->size), 
                                                               req->size, &tmp);
                                }
                        }
@@ -110,7 +113,7 @@ void bx_cpu_c::dispatch_ioreq(ioreq_t *req)
                                for (i = 0; i < req->count; i++) {
                                        unsigned long tmp;
 
-                                       BX_MEM_READ_PHYSICAL((Bit32u) req->u.pdata + (i * req->size), req->size, 
+                                       BX_MEM_READ_PHYSICAL((Bit32u) req->u.pdata + (sign * i * req->size), req->size, 
                                                         &tmp);
                                        BX_OUTP(req->addr, (Bit32u) tmp, req->size);
                                }
@@ -129,14 +132,14 @@ void bx_cpu_c::dispatch_ioreq(ioreq_t *req)
                        if (req->dir == IOREQ_READ) {
                                //BX_INFO(("<READ>addr:%llx, pdata:%llx, size: %x, count: %x\n", req->addr, req->u.pdata, req->size, req->count));
                                for (i = 0; i < req->count; i++) {
-                                       BX_MEM_READ_PHYSICAL(req->addr + (i * req->size), req->size, &tmp);
-                                       BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (i * req->size), req->size, &tmp);
+                                       BX_MEM_READ_PHYSICAL(req->addr + (sign * i * req->size), req->size, &tmp);
+                                       BX_MEM_WRITE_PHYSICAL((Bit32u) req->u.pdata + (sign * i * req->size), req->size, &tmp);
                                }
                        } else if (req->dir == IOREQ_WRITE) {
                                //BX_INFO(("<WRITE>addr:%llx, pdata:%llx, size: %x, count: %x\n", req->addr, req->u.pdata, req->size, req->count));
                                for (i = 0; i < req->count; i++) {
-                                       BX_MEM_READ_PHYSICAL((Bit32u)req->u.pdata + (i * req->size), req->size, &tmp);
-                                       BX_MEM_WRITE_PHYSICAL(req->addr + (i * req->size), req->size, &tmp);
+                                       BX_MEM_READ_PHYSICAL((Bit32u)req->u.pdata + (sign * i * req->size), req->size, &tmp);
+                                       BX_MEM_WRITE_PHYSICAL(req->addr + (sign * i * req->size), req->size, &tmp);
                                }
                        }
                }